package com.example.function.integration.aop;

import com.alibaba.fastjson2.util.DateUtils;
import com.example.function.integration.annotation.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Date;

/**
 * 功能描述: 定义一个AOP切面类，用于拦截带有@OperationType注解的方法。
 *
 * @Author: fengcheng
 * @Date: 2024/10/08 16:49
 */
@Slf4j
@Aspect
@Component
public class CommonAop {

    /**
     * @Description： AOP切入点配置，拦截带有@OperationType注解的方法。
     * @Param：null
     * @Author： fengcheng
     * @Date： 2024/10/8 10:35
     * @Return：
     */

    @Pointcut("@annotation(com.example.function.integration.annotation.OperationType)")
    public void pointcut() {
    }

    /**
     * @Description： AOP切入点在方法前后执行逻辑。
     * @Param：joinPoint
     * @Author： fengcheng
     * @Date： 2024/10/8 10:34
     * @Return： void
     */
    @Around("pointcut()")
    public Object before(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("******拦截前的逻辑******执行开始时间：" + DateUtils.toString(new Date()));
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        OperationType annotation = method.getAnnotation(OperationType.class);
        log.info("注解操作类型值: " + annotation.type());
        log.info("注解操作类型描述值: " + annotation.desc());
        //获取传入目标方法的参数
        log.info("方法请求入参：" + Arrays.toString(joinPoint.getArgs()));

        log.info("******拦截前的逻辑******执行结束时间：" + DateUtils.toString(new Date()));
        return joinPoint.proceed();
    }
}
